-- MaintainBulletinM
-- Created by chengb Aug/5/2015
-- 系统维护公告

module("MaintainBulletinM", package.seeall);

-- 配置表
local maintainBulletinTable = {};
local maintainEndTime = nil;
local maintainStartTime = nil;

-- 载入配置表
local _init = false;
local loadCsv = function()
    if _init then return end
    _init = true;

    -- 载入系统维护公告配置表
    local maintain_bulletin_CSV = get_maintain_bulletin_CSV();
    for i = 1, #maintain_bulletin_CSV do
        local id = maintain_bulletin_CSV[i].id;
        maintainBulletinTable[id] = maintain_bulletin_CSV[i];
    end
    maintain_bulletin_CSV = {};
end

-- 初始化
function init()
    loadCsv();
    maintainEndTime = nil;
    maintainStartTime = nil;
end

-- 检索配置
function query(id, path)
    local m = maintainBulletinTable[id];
    if not m or path == "" or not path then
        return m;
    end

    return m[path];
end

-- 获取联系方式
function getContact()
    local contact = "";

    local key = "dislist_contact_cn";
    if isOverseaPackage() then
        key = "dislist_contact"
    end

    if PUBLISH_PLATFORM == PUBLISH_TYPE_UC then
        -- 如果是uc平台，只有联系方式开关打开时才需要显示
        if GameBoardM.isContactEnabled() then
            contact = getLocStr(key);
        end
    else
        contact = getLocStr(key);
    end
    return contact;
end

-- 获取维护公告
function getMaintainBulletin()
    local config = getDislistConfig();
    if type(config) ~= "table" or
       type(config["maintain_bulletin"]) ~= "table" then
        -- 没有配置公告
        return nil;
    end

    local bulletin  = config["maintain_bulletin"];
    local id        = bulletin["templete"];            -- 公告模板id
    local startTime = bulletin["start_time"] or "";    -- 维护开始时间
    local endTime   = bulletin["end_time"]   or "";    -- 维护结束时间
    local contact   = getContact();                    -- 联系方式
    local version   = bulletin["version"]    or "";    -- 维护后的版本号
    local timeOffset = bulletin["time_offset"] or 0;

    local content = query(id, "content");
    if content == nil then
        error("系统维护公告模板(%d)不存在。", id);
    end

    if string.match(content, "{start_time}") ~= nil then
        content = string.gsub(content, "{start_time}", startTime);
    end

    if string.match(content, "{end_time}") ~= nil then
        content = string.gsub(content, "{end_time}", endTime);
    end

    if string.match(content, "{contact}") ~= nil then
        content = string.gsub(content, "{contact}", contact);
    end

    if string.match(content, "{version}") ~= nil then
        content = string.gsub(content, "{version}", version);
    end

    -- 更新下服务器距离零时区的时间偏移量
    TimeM.updateServerTimeOffset(timeOffset);

    -- 计算结束时间
    -- left_time替换在UIConfirm2中进行
    local _, _, hour3, hour4, mins3, mins4 = string.find(bulletin["start_time"], "(%d)(%d):(%d)(%d)");
    local _, _, hour1, hour2, mins1, mins2 = string.find(bulletin["end_time"], "(%d)(%d):(%d)(%d)");
    local hour = hour1 * 10 + hour2;
    local mins = mins1 * 10 + mins2;

    if hour3 * 10 + hour4 > hour then
        -- 认为跨天了
        hour = hour + 24;
    end

    -- 计算维护结束时间
    maintainStartTime = (hour3 * 10 + hour4) * 3600 + (mins3 * 10 + mins4) * 60;
    maintainEndTime = hour * 3600 + mins * 60;

    return {
        ["id"]      = id,
        ["title"]   = query(id, "title"),
        ["content"] = content,
    };
end

-- 计算剩余时间
function calcLeftTime(startTime, endTime)
    startTime = startTime or maintainStartTime;
    endTime = endTime  or maintainEndTime;

    -- 当前世界时间
    local serverTime = os.time() - TimeM.getTimeOffsetDifference();
    local t = os.date("*t", serverTime);
    if (t.hour * 3600 + t.min * 60) < startTime then
        -- 认为跨天了
        t.hour = t.hour + 24;
    end

    local leftTime = endTime - (t.hour * 3600 + t.min * 60 + t.sec);
    return math.max(leftTime, 0);
end

-- 获取世界时间描述
function getWorldTimeDesc()
    local serverTime = os.time() - TimeM.getTimeOffsetDifference();
    local t = os.date("*t", serverTime);
    if t.month < 10 then
        t.month = "0" .. t.month;
    end
    if t.day < 10 then
        t.day = "0" .. t.day;
    end
    if t.hour < 10 then
        t.hour = "0" .. t.hour;
    end
    if t.min < 10 then
        t.min = "0" .. t.min;
    end
    if t.sec < 10 then
        t.sec = "0" .. t.sec;
    end

    -- 拼接服务器时间
    local timeText = string.format(getLocStr("cur_world_time"), t.year, t.month, t.day, t.hour, t.min, t.sec);
    return timeText;
end

-- 系统是否在维护中
function isSysMaintaining()
    local dislist = getDislistConfig();
    if type(dislist) ~= "table" then
        return false;
    end

    return dislist["client_maintaining"] == 1 or dislist["server_maintaining"] == 1;
end

-- 获取dislist配置
function getDislistConfig()
    return _G["dislist"];
end

-- 获取apk下载链接
function getPackageDownloadUrl()
    if not _G["dislist"] or not _G["dislist"]["package_url"] then
        -- 没有配置下载链接
        return "";
    end

    if isAndroidPlatform() then
        return _G["dislist"]["package_url"]["android"] or "";
    else
        return _G["dislist"]["package_url"]["ios"] or "";
    end
end

-- 获取apk评论链接
function getPackageCommentUrl()
    if not _G["dislist"] or not _G["dislist"]["comment_url"] then
        -- 没有配置下载链接
        return "";
    end

    if isAndroidPlatform() then
        return _G["dislist"]["comment_url"]["android"] or "";
    else
        return _G["dislist"]["comment_url"]["ios"] or "";
    end
end

-- 获取雷霆运营综合连接
function getLtOperationUrl()
    if not _G["dislist"] or not _G["dislist"]["lt_operation_url"] then
        -- 没有配置下载链接
        return "";
    end

    if isAndroidPlatform() then
        return _G["dislist"]["lt_operation_url"]["android"] or "";
    else
        return _G["dislist"]["lt_operation_url"]["ios"] or "";
    end
end